package com.zzyq.pc.web.analysis.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zzyq.pc.common.plugin.shiro.TokenManager;
import com.zzyq.pc.mongodb.dao.MongodbOperation;
import com.zzyq.pc.mongodb.model.MongodbDate;
import com.zzyq.pc.utils.LoggerUtils;
import com.zzyq.pc.web.analysis.model.Analysis;
import com.zzyq.pc.web.analysis.service.IAnalysisService;
import com.zzyq.pc.web.configure.service.IInformationService;

@Service
public class AnalysisServiceImpl implements IAnalysisService {

	MongodbOperation mo = new MongodbOperation();

	@Autowired
	private IInformationService informationService;

	/**
	 * 媒体舆情分析
	 * 
	 * @param entity
	 *            mongodbDate映射类
	 * @param starDate
	 *            开始的日期（yyyy-MM-dd）
	 * @param endDate
	 *            结束的日期（yyyy-MM-dd）
	 * @return Analysis对象
	 */
	@Override
	public List<Analysis> getMediaSentiment(Class<?> entity, String starDate, String endDate) {
		// 从session 对话请求中获取用户的团体ID
		Integer companyId = TokenManager.getUser().getCompany().getCompanyId();
		if (companyId != null) {
			String compareTime = new DateTime().withMillisOfDay(0).toString("yyyy-MM-dd");
			// 通过用户ID查询用户所属的方案ID并放入List集合中
			List<String> allIfmIds = new ArrayList<String>();
			List<Integer> intlist = informationService.selectIDsBycompanyId(companyId);
			if (intlist != null && !intlist.isEmpty()) {
				for (Integer integer : intlist) {
					allIfmIds.add(integer.toString());
				}
			}
			if (allIfmIds == null || allIfmIds.isEmpty()) {
				return null;// 方案ID为空 直接返回NULL
			}
			// 将敏感方案ID 再次加入新的List 集合中
			List<String> negativeIfmIds = new ArrayList<String>();
			List<Integer> minList = informationService.selectSensitiveIDs(intlist);
			if (minList != null && !minList.isEmpty()) {
				for (Integer integer : minList) {
					negativeIfmIds.add(integer.toString());
				}
			}
			// 时间为空默认昨天零点到今天零点
			if (StringUtils.isBlank(starDate) && StringUtils.isBlank(endDate)) {
				DateTime dt = new DateTime().withMillisOfDay(0);
				endDate = dt.toString("yyyy-MM-dd");
				starDate = dt.toString("yyyy-MM-dd");
			}
			// 只传入开始时间没传结束时间默认查七天
			else if (StringUtils.isNotBlank(starDate) && StringUtils.isBlank(endDate)) {
				DateTime dt = new DateTime(starDate);
				endDate = dt.plusDays(6).toString("yyyy-MM-dd");
				if (endDate.compareTo(compareTime) > 0) {
					endDate = compareTime;
				}
			}

			// 只传入结束时间没传开始时间默认查七天
			else if (StringUtils.isBlank(starDate) && StringUtils.isNotBlank(endDate)) {
				DateTime dt = new DateTime(endDate);
				starDate = dt.minusDays(6).toString("yyyy-MM-dd");
			}
			return mo.getMediaSentiment(MongodbDate.class, allIfmIds, negativeIfmIds, starDate, endDate);
		}
		LoggerUtils.error(getClass(), "请求错误，系统获取用户ID为null");
		return null;
	}

	/**
	 * 网络舆情分析
	 *
	 * @param entity
	 *            mongodbDate映射类
	 * @param starDate
	 *            开始的日期（yyyy-MM-dd）
	 * @param endDate
	 *            结束的日期（yyyy-MM-dd）
	 * @param articleTypes
	 *            渠道类型集合
	 * @return Analysis对象
	 */
	@Override
	public List<Analysis> getNetworkSentiment(Class<?> entity, String starDate, String endDate,
			Set<String> articleTypes) {
		// 从session 对话请求中获取用户的团体ID
		Integer companyId = TokenManager.getUser().getCompany().getCompanyId();
		if (companyId != null) {
			String compareTime = new DateTime().withMillisOfDay(0).toString("yyyy-MM-dd");
			// 通过用户ID查询用户所属的方案ID并放入List集合中
				List<String> allIfmIds = new ArrayList<String>();
				List<Integer> intlist = informationService.selectIDsBycompanyId(companyId);
				if (intlist != null && !intlist.isEmpty()) {
					for (Integer integer : intlist) {
						allIfmIds.add(integer.toString());
					}
				}
				if (allIfmIds == null || allIfmIds.isEmpty()) {
				return null;// 方案ID为空 直接返回NULL
				}
			// 将敏感方案ID 再次加入新的List 集合中
				List<String> negativeIfmIds = new ArrayList<String>();
				List<Integer> minList = informationService.selectSensitiveIDs(intlist);
				if (minList != null && !minList.isEmpty()) {
					for (Integer integer : minList) {
						negativeIfmIds.add(integer.toString());
					}
				}

			// 时间为空默认昨天零点到今天零点
				if (StringUtils.isBlank(starDate) && StringUtils.isBlank(endDate)) {
					DateTime dt = new DateTime().withMillisOfDay(0);
					endDate = dt.toString("yyyy-MM-dd");
				starDate = dt.toString("yyyy-MM-dd");
				}
			// 只传入开始时间没传结束时间默认查七天
				else if (StringUtils.isNotBlank(starDate) && StringUtils.isBlank(endDate)) {
					DateTime dt = new DateTime(starDate);
				endDate = dt.plusDays(6).toString("yyyy-MM-dd");
				if (endDate.compareTo(compareTime) > 0) {
					endDate = compareTime;
				}
				}

			// 只传入结束时间没传开始时间默认查七天
				else if (StringUtils.isBlank(starDate) && StringUtils.isNotBlank(endDate)) {
					DateTime dt = new DateTime(endDate);
				starDate = dt.minusDays(6).toString("yyyy-MM-dd");
				}
				return mo.getNetworkSentiment(MongodbDate.class, allIfmIds, negativeIfmIds, starDate, endDate,
						articleTypes);
		}
		LoggerUtils.error(getClass(), "请求错误，系统获取团体ID为null");
		return null;
	}

	/**
	 * 整体舆情分析
	 *
	 * @param entity
	 *            mongodbDate映射类
	 * @param starDate
	 *            开始的日期（yyyy-MM-dd）
	 * @param endDate
	 *            结束的日期（yyyy-MM-dd）
	 * @return List<Analysis> 对象集合
	 */
	@Override
	public List<Analysis> getWholeSentiment(Class<?> entity, String starDate, String endDate) {
		// 从session 对话请求中获取用户的团体ID
		Integer companyId = TokenManager.getUser().getCompany().getCompanyId();
		if (companyId != null) {
			String compareTime = new DateTime().withMillisOfDay(0).toString("yyyy-MM-dd");
			// 通过用户ID查询用户所属的方案ID并放入List集合中
			List<String> allIfmIds = new ArrayList<String>();
			List<Integer> intlist = informationService.selectIDsBycompanyId(companyId);
			if (intlist != null && !intlist.isEmpty()) {
				for (Integer integer : intlist) {
					allIfmIds.add(integer.toString());
				}
			}
			if (allIfmIds == null || allIfmIds.isEmpty()) {
				return null;// 方案ID为空 直接返回NULL
			}
			// 将敏感方案ID 再次加入新的List 集合中
			List<String> negativeIfmIds = new ArrayList<String>();
			List<Integer> minList = informationService.selectSensitiveIDs(intlist);
			if (minList != null && !minList.isEmpty()) {
				for (Integer integer : minList) {
					negativeIfmIds.add(integer.toString());
				}
			}

			// 时间为空默认昨天零点到今天零点
			if (StringUtils.isBlank(starDate) && StringUtils.isBlank(endDate)) {
				DateTime dt = new DateTime().withMillisOfDay(0);
				endDate = dt.toString("yyyy-MM-dd");
				starDate = dt.toString("yyyy-MM-dd");
			}
			// 只传入开始时间没传结束时间默认查七天
			else if (StringUtils.isNotBlank(starDate) && StringUtils.isBlank(endDate)) {
				DateTime dt = new DateTime(starDate);
				endDate = dt.plusDays(6).toString("yyyy-MM-dd");
				if (endDate.compareTo(compareTime) > 0) {
					endDate = compareTime;
				}
			}

			// 只传入结束时间没传开始时间默认查七天
			else if (StringUtils.isBlank(starDate) && StringUtils.isNotBlank(endDate)) {
				DateTime dt = new DateTime(endDate);
				starDate = dt.minusDays(6).toString("yyyy-MM-dd");
			}
			return mo.getWholeSentiment(MongodbDate.class, allIfmIds, negativeIfmIds, starDate, endDate);
		}
		LoggerUtils.error(getClass(), "请求错误，系统获取用户ID为null");
		return null;
	}

	/**
	 * 分析 获取单位时间内传入的方案ID集合中渠道的分发数 用做渠道饼图数据
	 *
	 * @param entity
	 *            mongodbDate映射类
	 * @param startTime
	 *            开始时间
	 * @param endTime
	 *            结束时间
	 * @param articleTypes
	 *            需要查询的渠道集合
	 * @return 数量集合
	 */
	@Override
	public Map<String, Integer> distribution(Class<?> entity, String starDate, String endDate,
			Set<String> articleTypes) {
		// 从session 对话请求中获取用户的团体ID
		Integer companyId = TokenManager.getUser().getCompany().getCompanyId();
		if (companyId != null) {
			String compareTime = new DateTime().withMillisOfDay(0).toString("yyyy-MM-dd");
			Long startTime = null;
			Long endTime = null;
			// 通过用户ID查询用户所属的方案ID并放入List集合中
			List<String> allIfmIds = new ArrayList<String>();

			List<Integer> intlist = informationService.selectIDsBycompanyId(companyId);
			if (intlist != null && !intlist.isEmpty()) {
				for (Integer integer : intlist) {
					allIfmIds.add(integer.toString());
				}
			}
			if (allIfmIds == null || allIfmIds.isEmpty()) {
				return null;// 方案ID为空 直接返回NULL
			}
			// 时间为空默认昨天零点到今天零点
			if (StringUtils.isBlank(starDate) && StringUtils.isBlank(endDate)) {
				DateTime dt = new DateTime().withMillisOfDay(0);
				endTime = dt.getMillis();
				startTime = dt.minusDays(1).getMillis();
			}
			// 只传入开始时间没传结束时间默认查七天
			else if (StringUtils.isNotBlank(starDate) && StringUtils.isBlank(endDate)) {
				DateTime dt = new DateTime(starDate);
				startTime = dt.withMillisOfDay(0).getMillis();
				endTime = dt.plusDays(7).withMillisOfDay(0).getMillis();// 取第8天的零点准没错
				if (endDate.compareTo(compareTime) > 0) {
					endDate = compareTime;
				}
			}
			// 只传入结束时间没传开始时间默认查七天
			else if (StringUtils.isBlank(starDate) && StringUtils.isNotBlank(endDate)) {
				DateTime dt = new DateTime(endDate);
				endTime = dt.plusDays(1).withMillisOfDay(0).getMillis();// 后一天的零点
				startTime = dt.minusDays(6).getMillis();
			}
			// 正常状态
			else {
				DateTime dtstarDate = new DateTime(starDate);
				DateTime dtendDate = new DateTime(endDate);
				if (dtstarDate.compareTo(dtendDate) == 0) {
				startTime = dtstarDate.withMillisOfDay(0).getMillis();
				endTime = dtendDate.plusDays(1).withMillisOfDay(0).getMillis();
				} else {
					startTime = dtstarDate.withMillisOfDay(0).getMillis();
					endTime = dtendDate.withMillisOfDay(0).getMillis();
				}
			}
			return mo.distribution(MongodbDate.class, allIfmIds, startTime, endTime, articleTypes);
		}
		LoggerUtils.error(getClass(), "请求错误，系统获取用户ID为null");
		return null;
	}

}
